#pragma once
#include<iostream>
#include<memory>
#include"Socket.hpp"
#include"Channel.hpp"

using namespace SocketModule;
const int defaultport = 8080;
//专门去获取新链接的
class Listener : public Connection
{
public:
    Listener(int port = defaultport):_port(port),_listensock(std::make_unique<TcpSocket>())
    {
        _listensock->BuildTcpSocketMethod(_port);
        //尤其注意设置为ET模式
        SetEvent(EPOLLIN | EPOLLET);//listen对应是事件比较特殊，只有读事件，这里直接设置
        SetNonBlock(_listensock->Fd());//文件描述符设置为非阻塞
        //SetSockFd(_listensock->Fd());
    }
    ~Listener()
    {}
    void Recver() override
    {
        //accept
        //LOG(LogLevel::DEBUG) << "进入Listener模块的Recver函数";
        InetAddr client;
        while(true)
        {
            int sockfd = _listensock->Accept(&client);
            if(sockfd == ACCEPT_ERR)
                break;
            else if(sockfd == ACCEPT_CONTINUE)
                continue;
            else if(sockfd == ACCEPT_DONE)
                break;
            else
            {
                //得到合法的fd
                std::shared_ptr<Connection> conn = std::make_shared<Channel>(sockfd,client);
                conn->SetEvent(EPOLLIN | EPOLLET);
                if(_handler != nullptr)//listener模块的回调不为空的话，就给所有的Channel模块
                    conn->RegisterHandler(_handler);
                GetOwner()->AddConnection(conn);
            }
        }
    }
    int GetSockFd() override
    {
        return _listensock->Fd();
    }

    void Sender() override
    {}
    void Excepter() override
    {}
    // void AppendOutBuffer(const std::string &out) override
    // {
    // }
    // std::string& Inbuffer() override
    // {
    // }
private:
    int _port;
    std::unique_ptr<Socket> _listensock;
};